package org.rkuk.kasutil.media 
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import org.rkuk.kasutil.designPatternTools.AbstractTool;
	
	/**
	 * 由于根据MediaSource的来源不同，在操作Stream和Strea发出事件的表现会有所不同
	 * 因此使用MediaProxy统一对MediaSource的操作方式和发出事件的方式，以供MediaState使用
	 * @author rkuk
	 */
	internal class MediaProxy extends EventDispatcher 
	{
		public function MediaProxy(media:IMediaSource)
		{
			AbstractTool.makeAbstractClass(this, MediaProxy);
			this.media = media;
		}
		
		/**
		 * 废弃当前MediaProxy
		 */
		public function dispose():void
		{
			AbstractTool.makeAbstractMethod(this, "dispose");
		}
		
		/**
		 * 设置Media的播放状态
		 */
		public function set state(value:MediaState):void
		{
			AbstractTool.makeAbstractMethod(this, "state");
		}
		
		/**
		 * 获取Media的播放状态
		 */
		public function get state():MediaState
		{
			return AbstractTool.makeAbstractMethod(this, "state");
		}
		
		/**
		 * 让被代理的Media发出事件
		 * @param	e	发出的事件
		 */
		public function sendMediaEvent(e:Event):void
		{
			AbstractTool.makeAbstractMethod(this, "sendMediaEvent");
		}
		
		/**
		 * 代理直接操作Media播放的方法，而非MediaState操作Media播放的方法
		 */
		public function start(...rest):void
		{
			AbstractTool.makeAbstractMethod(this, "start");
		}
		
		/**
		 * 代理直接操作Media停止的方法，而非MediaState操作Media停止的方法
		 */
		public function stop():void
		{
			AbstractTool.makeAbstractMethod(this, "stop");
		}
		
		/**
		 * 代理直接操作Media继续播放的方法，而非MediaState操作Media继续播放的方法
		 */
		public function resume():void
		{
			AbstractTool.makeAbstractMethod(this, "resume");
		}
		
		/**
		 * 代理直接操作Media暂停的方法，而非MediaState操作Media暂停的方法
		 */
		public function pause():void
		{
			AbstractTool.makeAbstractMethod(this, "pause");
		}
		
		/**
		 * 代理直接操作Media跳至指定时间的方法，而非MediaState操作Media跳至指定时间的方法
		 */
		public function seek(offset:Number):void
		{
			AbstractTool.makeAbstractMethod(this, "seek");
		}
		/**
		 * 获取被代理饿MediaSource是否处于缓冲状态
		 */
		public function get isBuffering():Boolean
		{
			return AbstractTool.makeAbstractMethod(this, "isBuffering");
		}
		
		/**
		 * 当Media的Url变化时，要先停止老的Media之后，再调用此处将Media的Url刷新
		 */
		public function updateMediaUrl():void
		{
			AbstractTool.makeAbstractMethod(this, "updateMediaUrl");
		}
	}
}